let fs = require('fs');
const sugar = loader('sugar')
const path = require("path")
let file_list=[];
//监控控制器
module.exports=function(){
  let filepath = sugar.path("<controller>");
  start(filepath);
  global.monitor[__filename]={stop};
}

function start(filepath){
  //读取这个文件夹下的所有控制器文件
  fs.readdirSync(filepath).forEach(res=>{
    if(fs.lstatSync(path.resolve(filepath,res)).isDirectory() && res !== 'kernel'){
      //是文件夹
      start(path.resolve(filepath,res));
    }else{
      file_list.push(path.resolve(filepath,res));
      //是一个文件，进行监控
      fs.watchFile(path.resolve(filepath,res),{
        //每100毫秒检测一次
        interval:100,persistent:false
      },(cur, prv) => {
        global.clear();
        console.log('\033[30;43m CONDUCT \033[40;33m updateRout... ')
        console.time('\033[42;30m DONE \033[40;32m Compiled successfully in ');
        //先停止该文件所监听的文件,然后清除该模块的缓存重启模块
        loader(global.monitor[sugar.path("/monitor/"+filename)].stop(),true)();
        global.clear();
        //清除这个控制器的缓存,第二个参数说明要清除缓存
        loader(path.resolve(filepath,res),true);
        //控制器被改变了，重新生成路由，生成路由不需要考虑性能
        loader('run_route').start();
        console.timeEnd('\033[42;30m DONE \033[40;32m Compiled successfully in ');
      })
    }
  })
}

//清除所有的监控
function stop(){
  delete global.monitor[__filename];
  file_list.forEach(res=>{
    //停止监控
    fs.unwatchFile(res);
  })
  //清除本身缓存
  delete require.cache[__filename];
  return __filename;
}